class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        List<Integer> res = new ArrayList<Integer>(m*n);

        // 规定四边界，边界顺序不反转即可继续
        int u = 0, d = m - 1, l = 0, r = n - 1;
        while(true){
            for (int i = l; i <= r; i++)
                res.add(matrix[u][i]);
            if (++u > d)
                break;

            for (int i = u; i <= d; i++)
                res.add(matrix[i][r]);
            if (--r < l)
                break;

            for (int i = r; i >= l; i--)
                res.add(matrix[d][i]);
            if (--d < u)
                break;

            for (int i = d; i >= u; i--)
                res.add(matrix[i][l]);
            if (++l > r)
                break;
        }
        return res;
    }
}